Modelo de Aprendizaje Automático para la Probabilidad de Impago

Walter Quispe Vargas, PhD

DAME-UNSAAC

2023-10-10

Contenido

  • Riesgo de Crédito y Probabilidad de Impago (Default)
  • Desarrollo de Modelos en Aprendizaje Automatizado (Machine Learning Modeling)
    • Pre-procesamiento de Datos
    • Selección de Variables y Modelo
    • Extreme Gradient Boosting (XGBoost)
    • Explicabilidad del Modelo.

Riesgo de Crédito








  • La posibilidad de una pérdida, resultante de que el prestatario no pague un préstamo o no cumpla con sus obligaciones contractuales.

Pérdida Creditícia Esperada (ECL)

  • \[ECL = PD \times LGD \times EAD\]

  • \(PD\): Probabilidad de Impago (Probability of Default)

    • Modelos de Clasificación
  • \(LGD\): Pérdida dado el Impago (Loss Given Default)

  • \(EAD\): Exposición al Impago (Exposure At Default)

    • Modelos de Regresión (Tobit, Beta)

Probabilidad de Impago (PD)

  • De acuerdo con IFRS 9 y CECL:

    • “El impago ocurre cuando la institución bancaria considera que es poco probable que el deudor pague la totalidad de sus obligaciones crediticias al grupo bancario”. (Bellini, 2019)

Machine Learning Modeling






  • CONTEXTO

  • Observar el comportamiento de pagos de los clientes en un periodo de 12 meses, si durante este periodo, el atraso máximo a nivel clientes supera el umbral de 60 días, diremos que el cliente ha hecho default.

Pre-procesamiento de Datos

VARIABLE DESCRIPCIÓN
FLG_CLI_DEF60 Default
DIF_BU_MA_100_12M DIFERENCIA ENTRE MESES DE BUEN Y MAL COMPORTAMIENTO CON MATERIALIDAD>100||Diferencia entre meses de buen comportamiento(calificación=0) y mal comportamiento(calificacióm>0) en los últimos 12 meses (umbral materialidad=100)
DIF_BU_MA_100_24M DIFERENCIA ENTRE MESES DE BUEN Y MAL COMPORTAMIENTO CON MATERIALIDAD>100||Diferencia entre meses de buen comportamiento(calificación=0) y mal comportamiento(calificacióm>0) en los últimos 24 meses (umbral materialidad=100)
DIF_BU_MA_12M DIFERENCIA ENTRE MESES DE BUEN Y MAL COMPORTAMIENTO CON MATERIALIDAD>0||Diferencia entre meses de buen comportamiento(calificación=0) y mal comportamiento(calificacióm>0) en los últimos 12 meses (umbral materialidad=0)
DIF_BU_MA_500_12M DIFERENCIA ENTRE MESES DE BUEN Y MAL COMPORTAMIENTO CON MATERIALIDAD>500||Diferencia entre meses de buen comportamiento(calificación=0) y mal comportamiento(calificacióm>0) en los últimos 12 meses (umbral materialidad=500)
DIF_BU_MA_ALI_12M DIFERENCIA ENTRE MESES DE BUEN Y MAL COMPORTAMIENTO ALINEADO CON MATERIALIDAD>0||Diferencia entre meses de buen comportamiento alineado(calificación alineada=0) y mal comportamiento(calificación alienada>0) en los últimos 12 meses (umbral materialidad=0)
FLG_DVNCD_24M FLAG DEUDA VENCIDA||Indica la existencia de deuda vencida en los últimos 24 meses
INC_MAX_DTOTSH_ACTU_24M INCREMENTO DE DEUDA TOTAL S/HIP. (CONSIDERANDO MÁXIMO)||Máxima deuda total s/hip. en los últimos 24 meses respecto a la deuda total s/hip. actual
INC_MAX_ENT_ACTU_24M INCREMENTO DE ENTIDADES ACREEDORAS (CONSIDERANDO MÁXIMO)||Máximo nro. de entidades en los últimos 24 meses respecto al nro. de entidades actual
INC_SUM_ACTSH_ACTU_24M INCREMENTO DE DEUDA ACTIVA S/HIP. (CONSIDERANDO SUMA)||Total deuda activa s/hip. en los últimos 24 meses respecto a la deuda activa s/hip. actual
MAX_ATR_24M ATRASO MÁXIMO||Nro. máximo de dias de atraso en los último 24 meses
MAX_ATR_I_12M MAX_ATR||Máximo atrasos en los últimos 12 meses
MAX_ATR_I_18M MAX_ATR||Máximo atrasos en los últimos 18 meses
MAX_ATR_I_U6K_24M MAX_ATR||Máximo atrasos en los últimos 6 meses de comportamiento en los últimos 24 meses
MAX_DEUNOREV_12M MÁXIMA DEUDA NO REVOLVENTE||Máxima deuda asociada al concepto 'Préstamo no revolvente' en los últimos 12 meses
MAX_DEU_JUD_24M MÁXIMA DEUDA JUDICIAL||Máxima deuda judicial en los últimos 24 meses
MAX_ENT_12M MÁXIMA CANTIDAD DE ENTIDADES ACREEDORAS||Nro. máximo de entidades acreedoras en los últimos 12 meses
NMES_ATR15_I_U6K_24M N_MESES_ATR||Número de meses con atrasos mayores iguales a 15 en los últimos 6 meses de comportamiento en los últimos 24 meses
NMES_UATR15_I_U6K_24M N_MESES_UATR||Número de meses desde el último atraso mayor o igual a 15 días, en los últimos 6 meses de comportamiento en una ventana de 24 meses (distancia)
NMES_UATR1_I_24M N_MESES_UATR||Número de meses desde el último atraso mayor o igual a 1 días de atraso observado en los 24 últimos meses (distancia)
NMES_UATR3_I_24M N_MESES_UATR||Número de meses desde el último atraso mayor o igual a 3 días de atraso observado en los 24 últimos meses (distancia)
N_BU1000_01_18M MESES BUEN COMPORTAMIENTO (0 ó 1) CON MATERIALIDAD>1000||Nro. De Meses con calificación 'NORMAL' o 'CPP' y materialidad>1000 en los últimos 18 meses
N_BU1000_ALI_18M MESES BUEN COMPORTAMIENTO ALINEADO CON MATERIALIDAD > 1000||Nro. de meses con buen comportamiento alineado en los últimos 18 meses (umbral de materialidad = 1000 soles)
N_BU100_12M MESES BUEN COMPORTAMIENTO CON MATERIALIDAD > 100||Nro. de meses con buen comportamiento en los últimos 12 meses (umbral de materialidad = 100 soles)
N_BU_01_12M MESES BUEN COMPORTAMIENTO (0 ó 1) CON MATERIALIDAD>0||Nro. De Meses con calificación 'NORMAL' o 'CPP' y materialidad>0 en los últimos 12 meses
N_BU_12M MESES BUEN COMPORTAMIENTO CON MATERIALIDAD > 0||Nro. de meses con buen comportamiento en los últimos 12 meses (umbral de materialidad = 0 soles)
N_DEU_ACTSH_18M NRO. DE MESES CON DEUDA ACTIVA SIN HIPOTECARIA||Nro. de meses con deuda activa sin deuda hipotecaria en los últimos 18 meses
N_NEG_24M NRO. DE MESES CON DEUDA NEGOCIO||Nro. de meses con deuda negocio(micro,pequeña y mediana) en los últimos 24 meses
N_NOR_12M NRO. DE MESES CON CALIFICACIÓN "NORMAL"||Nro. de meses que el cliente fue calificado como 'NORMAL'. En los últimos 12 meses
N_NOR_24M NRO. DE MESES CON CALIFICACIÓN "NORMAL"||Nro. de meses que el cliente fue calificado como 'NORMAL'. En los últimos 24 meses
N_ULT_DIFNOR_12M NRO. DE MESES DESDE QUE LA ÚLTIMA VEZ QUE SE REPORTÓ CALIFICACIÓN DIFERENTE "NORMAL"||Nro. De meses de la última vez que se reportó calificación diferente a 'Normal' en los últimos 12 meses
N_ULT_DIFNOR_24M NRO. DE MESES DESDE QUE LA ÚLTIMA VEZ QUE SE REPORTÓ CALIFICACIÓN DIFERENTE "NORMAL"||Nro. De meses de la última vez que se reportó calificación diferente a 'Normal' en los últimos 24 meses
N_ULT_NOR_ALI_24M NRO. DE MESES DESDE QUE LA ÚLTIMA VEZ QUE SE REPORTÓ CALIFICACIÓN ALINEADA "NORMAL"||Nro. De Meses de la última vez que se reportó calificación alineada 'Normal' en los últimos 24 meses
PROM_DEUREV_24M PROMEDIO DEUDA REVOLVENTE||Promedio de la deuda revolvente en los últimos 24 meses
PROM_DEUVNCD_12M PROMEDIO DEUDA VENCIDA||Promedio de deuda vencida en los últimos 12 meses
RMAX_DACT_DACTSH_24M MÁXIMA DEUDA ACTIVA RESPECTO A LA MÁXIMA DEUDA ACTIVA S/HIP.||Ratio de la máxima deuda activa respecto a la máxima deuda activa sin deuda hipotecaria en los últimos 24 meses
RMAX_DREV_DDIR_24M MÁXIMA DEUDA REVOLVENTE RESPECTO A LA MÁXIMA DEUDA DIRECTA||Ratio de la máxima deuda revolvente sobre la máxima deuda directa en los últimos 24 meses
RMAX_DVNCD_DDIR_12M MÁXIMA DEUDA VENCIDA RESPECTO A LA MÁXIMA DEUDA DIRECTA||Ratio de la máxima deuda vencida sobre la máxima deuda directa en los últimos 12 meses
RTOT_DACT_DTOT_24M TOTAL DEUDA ACTIVA RESPECTO AL TOTAL DE DEUDA TOTAL||Ratio del total de la deuda activa sobre el total de la deuta total en los últimos 24 meses
RTOT_DVNCD_DDIR_12M TOTAL DEUDA VENCIDA RESPECTO AL TOTAL DE DEUDA DIRECTA||Ratio del total de la deuda vencida sobre el total de la deuda directa en los últimos 12 meses
R_DREV_DDIR_24M DEUDA REVOLVENTE PROMEDIO RESPECTO A LA DEUDA DIRECTA PROMEDIO||Ratio del promedio de la deuda revolvente sobre el promedio de la deuda directa en los últimos 24 meses
R_DVNCD_DDIR_12M DEUDA VENCIDA PROMEDIO RESPECTO A LA DEUDA DIRECTA PROMEDIO||Ratio del promedio de la deuda vencida sobre el promedio de la deuda directa en los últimos 12 meses
VAR_MAX_CAL_ACTU_24M VARIACIÓN DE CALIFICACIÓN (CONSIDERANDO MÁXIMO)||Máxima calificación en los últimos 24 meses (se consideran nulos) respecto califación actual
VAR_PROM_DEUDIR_ACTU_12M VARIACIÓN DE DEUDA DIRECTA (CONSIDERANDO PROMEDIO)||Deuda directa promedio en los últimos 12 meses respecto a la deuda directa actual
VAR_PROM_ENT_ACTU_24M VARIACIÓN DE ENTIDADES ACREEDORAS (CONSIDERANDO PROMEDIO)||Promedio de nro. de entidades en los últimos 18 meses respecto al nro. de entidades actual

Número de Variables: 47
Número de Obsevaciones: 50620

FLG_CLI_DEF60 DIF_BU_MA_100_12M DIF_BU_MA_100_24M DIF_BU_MA_12M DIF_BU_MA_500_12M DIF_BU_MA_ALI_12M FLG_DVNCD_24M INC_MAX_DTOTSH_ACTU_24M INC_MAX_ENT_ACTU_24M INC_SUM_ACTSH_ACTU_24M MAX_ATR_24M MAX_ATR_I_12M MAX_ATR_I_18M MAX_ATR_I_U6K_24M MAX_DEUNOREV_12M MAX_DEU_JUD_24M MAX_ENT_12M NMES_ATR15_I_U6K_24M NMES_UATR15_I_U6K_24M NMES_UATR1_I_24M NMES_UATR3_I_24M N_BU1000_01_18M N_BU1000_ALI_18M N_BU100_12M N_BU_01_12M N_BU_12M N_DEU_ACTSH_18M N_NEG_24M N_NOR_12M N_NOR_24M N_ULT_DIFNOR_12M N_ULT_DIFNOR_24M N_ULT_NOR_ALI_24M PROM_DEUREV_24M PROM_DEUVNCD_12M RMAX_DACT_DACTSH_24M RMAX_DREV_DDIR_24M RMAX_DVNCD_DDIR_12M RTOT_DACT_DTOT_24M RTOT_DVNCD_DDIR_12M R_DREV_DDIR_24M R_DVNCD_DDIR_12M VAR_MAX_CAL_ACTU_24M VAR_PROM_DEUDIR_ACTU_12M VAR_PROM_ENT_ACTU_24M
0 12 20 12 10 12 0 0.0000000 0.0000000 8.073189 0 2 2 2 3999.97 NA 1 0 0 0 0 10 10 12 12 12 15 0 12 20 NA NA 0 NA NA 2.3554764 1111111111 1.111111e+09 0.9862304 1.111111e+09 1111111111 1.111111e+09 0.00 -0.5498490 0.0000000
0 10 19 10 7 10 0 7.6388046 0.0000000 46.718352 0 9 9 1 NA NA 1 0 0 0 6 7 7 10 10 10 13 17 10 19 NA NA 0 NA NA 2.0890833 1111111111 1.111111e+09 0.7068346 1.111111e+09 1111111111 1.111111e+09 0.00 0.9414149 0.0000000
0 8 8 8 7 8 0 0.0000000 0.0000000 11.610907 0 0 0 0 NA NA 1 0 0 0 0 1 1 8 8 8 8 8 8 8 NA NA 0 NA NA 0.3328159 1111111111 1.111111e+09 0.2484270 1.111111e+09 1111111111 1.111111e+09 0.00 0.5763633 0.0000000
0 12 24 12 12 12 0 0.1496612 0.2500000 20.127711 0 2 2 1 NA NA 5 0 0 0 0 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 1.1179335 1111111111 1.111111e+09 0.8480767 1.111111e+09 1111111111 1.111111e+09 0.00 -0.1647091 0.0104167
0 12 24 12 12 12 0 0.7714297 0.3333333 33.343739 0 9 9 9 NA NA 3 0 0 0 1 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 1.2379058 1111111111 1.111111e+09 1.0000000 1.111111e+09 1111111111 1.111111e+09 0.00 0.3601333 0.0555556
0 12 24 12 12 12 0 0.8275129 2.0000000 16.391346 5 6 6 6 NA NA 1 0 0 3 5 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 0.7566835 1111111111 1.111111e+09 0.4355633 1.111111e+09 1111111111 1.111111e+09 0.00 -0.4004503 0.4583333
0 12 24 12 12 12 0 0.0473496 0.3333333 8.348128 0 4 4 4 NA NA 4 0 0 0 0 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 2.2666012 1111111111 1.111111e+09 0.8828532 1.111111e+09 1111111111 1.111111e+09 0.00 -0.4173642 0.0416667
0 12 16 12 7 12 1 0.1604806 0.0000000 23.085675 40 0 46 0 NA NA 1 0 0 14 14 10 8 12 12 12 18 24 12 20 NA 13 0 NA NA 1.1944698 1111111111 1.111111e+09 0.5412383 1.111111e+09 1111111111 1.111111e+09 0.50 -0.2173800 0.0000000
0 12 23 12 12 12 0 2.2112508 0.0000000 23.375479 0 2 2 2 NA NA 2 0 0 3 23 18 18 12 12 12 18 23 12 23 NA NA 0 NA NA 1.3594476 1111111111 1.111111e+09 0.6252419 1.111111e+09 1111111111 1.111111e+09 0.00 0.3538093 -0.3695652
0 12 24 12 12 12 0 0.3668338 0.0000000 25.659565 0 4 4 4 NA NA 1 0 0 0 2 16 16 12 12 12 18 24 12 24 NA NA 0 NA NA 1.3452564 1111111111 1.111111e+09 0.7712338 1.111111e+09 1111111111 1.111111e+09 0.00 0.4907462 0.0000000
0 12 24 12 12 12 0 0.5305610 0.0000000 44.610121 0 2 2 1 NA NA 1 0 0 4 0 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 0.9430242 1111111111 1.111111e+09 0.5730490 1.111111e+09 1111111111 1.111111e+09 0.00 0.8667258 0.0000000
0 12 24 12 12 12 0 1.8288607 0.5000000 55.716115 0 1 1 1 NA NA 3 0 0 1 0 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 1.1112819 1111111111 1.111111e+09 0.6611150 1.111111e+09 1111111111 1.111111e+09 0.00 0.7673727 0.1875000
0 12 24 12 12 12 0 0.0928965 0.2500000 17.981159 4 8 8 8 2512.18 NA 5 0 0 0 0 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 1.3590884 1111111111 1.111111e+09 0.9833503 1.111111e+09 1111111111 1.111111e+09 0.00 -0.1794118 0.0208333
0 12 24 12 12 12 0 0.0000000 0.0000000 14.948680 3 7 8 7 NA NA 3 0 0 1 1 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 0.9144325 1111111111 1.111111e+09 0.6076663 1.111111e+09 1111111111 1.111111e+09 0.00 -0.4560920 -0.1527778
0 8 8 8 8 8 0 0.1524429 0.0000000 7.216550 0 12 12 12 NA NA 1 0 0 0 0 8 8 8 8 8 8 8 8 8 NA NA 0 NA NA 1.1220699 1111111111 1.111111e+09 1.0000000 1.111111e+09 1111111111 1.111111e+09 0.00 0.0270687 0.0000000
0 12 24 12 12 12 0 0.1277390 0.0000000 10.939352 0 0 0 0 30346.72 NA 2 0 0 0 0 18 18 12 12 12 18 0 12 24 NA NA 0 NA NA 1.8183625 1111111111 1.111111e+09 0.7789653 1.111111e+09 1111111111 1.111111e+09 0.00 -0.1456317 -0.3125000
0 12 24 12 12 12 0 5.8148926 2.0000000 107.810017 0 4 4 1 NA NA 2 0 0 4 7 17 17 12 12 12 18 24 12 24 NA NA 0 NA NA 1.2192320 1111111111 1.111111e+09 0.4692076 1.111111e+09 1111111111 1.111111e+09 0.00 1.6191166 0.7916667
0 8 20 8 8 12 1 0.5300140 0.6666667 28.218202 50 2 4 1 16096.01 NA 4 0 0 0 15 17 18 10 11 10 18 24 10 22 4 4 0 NA 557.500 1.2542627 1111111111 7.030900e-03 0.9980110 6.875000e-04 1111111111 8.249800e-03 0.50 0.2580287 0.4166667
0 12 19 12 12 12 0 2.8916398 1.0000000 27.552551 0 1 1 0 NA NA 1 0 0 8 0 14 14 12 12 12 14 19 12 19 NA NA 0 NA NA 1.2558063 1111111111 1.111111e+09 0.4959401 1.111111e+09 1111111111 1.111111e+09 0.00 0.4078709 0.1052632
0 12 23 12 12 12 0 0.1070676 1.0000000 88.491641 0 1 1 1 NA NA 1 0 0 0 0 15 15 12 12 12 18 23 12 23 NA NA 0 NA NA 1.3120150 1111111111 1.111111e+09 0.5772440 1.111111e+09 1111111111 1.111111e+09 0.00 2.4790342 0.2608696
0 -2 10 -2 -2 0 1 0.1808735 0.2500000 26.926668 51 10 10 10 52746.03 NA 5 0 0 0 0 16 12 5 10 5 18 18 5 17 0 0 4 NA 66.355 1.0575965 1111111111 1.400500e-03 0.9809536 2.175000e-04 1111111111 1.304700e-03 0.00 0.1438397 -0.0520833
0 12 24 12 12 12 0 3.1437250 0.0000000 52.320669 0 1 1 1 NA NA 1 0 0 1 0 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 1.6762841 1111111111 1.111111e+09 0.8987544 1.111111e+09 1111111111 1.111111e+09 0.00 0.9510053 0.0000000
0 12 24 12 12 12 0 1.3986262 0.0000000 56.107698 3 4 4 4 3956.33 NA 2 0 0 0 1 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 1.3172357 1111111111 1.111111e+09 0.9611750 1.111111e+09 1111111111 1.111111e+09 0.00 0.8710648 -0.0208333
0 12 24 12 12 12 0 0.0248554 0.0000000 14.255641 0 11 11 11 10200.00 NA 4 0 0 1 1 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 1.4966892 1111111111 1.111111e+09 0.9267458 1.111111e+09 1111111111 1.111111e+09 0.00 -0.1578311 -0.0937500
0 5 5 5 5 5 0 0.5166861 0.0000000 5.402864 0 0 0 0 NA NA 1 0 0 0 0 1 1 5 5 5 5 5 5 5 NA NA 0 NA NA 1.1843811 1111111111 1.111111e+09 1.0000000 1.111111e+09 1111111111 1.111111e+09 0.00 0.2805728 0.0000000
0 7 7 7 6 11 1 17.7731890 3.0000000 101.413605 48 0 0 0 5285.92 NA 4 0 0 0 0 9 10 9 10 9 11 11 9 10 5 5 0 NA 0.100 1.2530556 1111111111 1.430000e-05 0.7504206 2.000000e-06 1111111111 2.190000e-05 0.50 8.3024894 2.0000000
0 12 24 12 12 12 0 0.1575518 0.0000000 20.635167 0 1 1 1 NA NA 1 0 0 0 0 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 1.2478202 1111111111 1.111111e+09 0.9678144 1.111111e+09 1111111111 1.111111e+09 0.00 0.0013326 0.0000000
0 10 22 10 10 10 0 1.3750770 0.0000000 38.034878 13 32 32 32 4877.72 NA 3 1 5 0 4 18 17 11 12 11 18 24 11 23 4 4 0 NA NA 1.4402796 1111111111 1.111111e+09 0.9858252 1.111111e+09 1111111111 1.111111e+09 0.25 0.6432264 -0.4027778
0 12 24 12 12 12 0 0.5430313 0.0000000 8.260933 0 5 5 5 NA NA 1 0 0 4 4 18 18 12 12 12 18 24 12 24 NA NA 0 NA NA 0.8209943 1111111111 1.111111e+09 0.3167989 1.111111e+09 1111111111 1.111111e+09 0.00 -0.5248432 0.0000000
0 12 24 12 12 12 0 0.4672046 0.0000000 17.278211 0 5 8 5 3050.12 NA 1 0 0 0 0 14 14 12 12 12 18 0 12 24 NA NA 0 NA NA 1.9264966 1111111111 1.111111e+09 1.0000000 1.111111e+09 1111111111 1.111111e+09 0.00 -0.0544008 0.0000000
skim_type skim_variable n_missing complete_rate numeric.mean numeric.sd numeric.p0 numeric.p25 numeric.p50 numeric.p75 numeric.p100 numeric.hist
numeric FLG_CLI_DEF60 0 1.0000000 1.070328e-01 3.091580e-01 0.0000000 0.000000e+00 0.000000e+00 0.000000e+00 1.0 ▇▁▁▁▁
numeric DIF_BU_MA_100_12M 5 0.9999012 1.036377e+01 3.133590e+00 -12.0000000 1.000000e+01 1.200000e+01 1.200000e+01 12.0 ▁▁▁▁▇
numeric DIF_BU_MA_100_24M 4 0.9999210 1.881638e+01 6.398260e+00 -24.0000000 1.500000e+01 2.200000e+01 2.400000e+01 24.0 ▁▁▁▂▇
numeric DIF_BU_MA_12M 5 0.9999012 1.038090e+01 3.129752e+00 -12.0000000 1.000000e+01 1.200000e+01 1.200000e+01 12.0 ▁▁▁▁▇
numeric DIF_BU_MA_500_12M 5 0.9999012 9.940393e+00 3.300733e+00 -12.0000000 9.000000e+00 1.200000e+01 1.200000e+01 12.0 ▁▁▁▂▇
numeric DIF_BU_MA_ALI_12M 5 0.9999012 1.070542e+01 2.719416e+00 -12.0000000 1.000000e+01 1.200000e+01 1.200000e+01 12.0 ▁▁▁▁▇
numeric FLG_DVNCD_24M 4 0.9999210 8.017230e-02 2.715624e-01 0.0000000 0.000000e+00 0.000000e+00 0.000000e+00 1.0 ▇▁▁▁▁
numeric INC_MAX_DTOTSH_ACTU_24M 4 0.9999210 7.705074e+06 1.854875e+08 0.0000000 7.736480e-02 3.092782e-01 8.409760e-01 5555555555.0 ▇▁▁▁▁
numeric INC_MAX_ENT_ACTU_24M 4 0.9999210 2.195180e+05 2.208571e+07 0.0000000 0.000000e+00 0.000000e+00 0.000000e+00 2222222222.0 ▇▁▁▁▁
numeric INC_SUM_ACTSH_ACTU_24M 4 0.9999210 1.020801e+07 2.136108e+08 0.0000000 1.020688e+01 1.642847e+01 2.510807e+01 5555555555.0 ▇▁▁▁▁
numeric MAX_ATR_24M 4 0.9999210 1.049050e+01 3.890515e+01 0.0000000 0.000000e+00 0.000000e+00 7.000000e+00 4542.0 ▇▁▁▁▁
numeric MAX_ATR_I_12M 10 0.9998024 6.936218e+00 1.491905e+01 0.0000000 1.000000e+00 3.000000e+00 7.000000e+00 1034.0 ▇▁▁▁▁
numeric MAX_ATR_I_18M 8 0.9998420 7.420118e+00 1.499013e+01 0.0000000 1.000000e+00 4.000000e+00 8.000000e+00 1034.0 ▇▁▁▁▁
numeric MAX_ATR_I_U6K_24M 7 0.9998617 6.173295e+00 1.482513e+01 0.0000000 1.000000e+00 3.000000e+00 7.000000e+00 1034.0 ▇▁▁▁▁
numeric MAX_DEUNOREV_12M 28177 0.4433623 6.463703e+03 9.874307e+03 0.0500000 1.588795e+03 3.046170e+03 6.877150e+03 184726.5 ▇▁▁▁▁
numeric MAX_DEU_JUD_24M 50591 0.0005729 4.186641e+04 5.319382e+04 2448.6500000 8.670430e+03 1.764173e+04 5.301127e+04 227716.2 ▇▁▁▁▁
numeric MAX_ENT_12M 5 0.9999012 2.043722e+00 1.085948e+00 1.0000000 1.000000e+00 2.000000e+00 3.000000e+00 9.0 ▇▃▁▁▁
numeric NMES_ATR15_I_U6K_24M 7 0.9998617 2.670855e-01 9.117975e-01 0.0000000 0.000000e+00 0.000000e+00 0.000000e+00 6.0 ▇▁▁▁▁
numeric NMES_UATR15_I_U6K_24M 7 0.9998617 9.870980e-02 6.152910e-01 0.0000000 0.000000e+00 0.000000e+00 0.000000e+00 23.0 ▇▁▁▁▁
numeric NMES_UATR1_I_24M 7 0.9998617 2.004090e+00 3.893925e+00 0.0000000 0.000000e+00 0.000000e+00 2.000000e+00 23.0 ▇▁▁▁▁
numeric NMES_UATR3_I_24M 7 0.9998617 2.480667e+00 4.736894e+00 0.0000000 0.000000e+00 0.000000e+00 3.000000e+00 23.0 ▇▁▁▁▁
numeric N_BU1000_01_18M 4 0.9999210 1.373467e+01 5.266151e+00 0.0000000 1.000000e+01 1.600000e+01 1.800000e+01 18.0 ▁▂▁▂▇
numeric N_BU1000_ALI_18M 4 0.9999210 1.359926e+01 5.273631e+00 0.0000000 1.000000e+01 1.600000e+01 1.800000e+01 18.0 ▁▂▁▂▇
numeric N_BU100_12M 5 0.9999012 1.081428e+01 2.094907e+00 0.0000000 1.000000e+01 1.200000e+01 1.200000e+01 12.0 ▁▁▁▁▇
numeric N_BU_01_12M 5 0.9999012 1.111665e+01 1.873406e+00 0.0000000 1.100000e+01 1.200000e+01 1.200000e+01 12.0 ▁▁▁▁▇
numeric N_BU_12M 5 0.9999012 1.083175e+01 2.086898e+00 0.0000000 1.100000e+01 1.200000e+01 1.200000e+01 12.0 ▁▁▁▁▇
numeric N_DEU_ACTSH_18M 4 0.9999210 1.595308e+01 3.659701e+00 0.0000000 1.500000e+01 1.800000e+01 1.800000e+01 18.0 ▁▁▁▁▇
numeric N_NEG_24M 4 0.9999210 1.573171e+01 9.350113e+00 0.0000000 7.000000e+00 2.000000e+01 2.400000e+01 24.0 ▃▂▂▂▇
numeric N_NOR_12M 5 0.9999012 1.083114e+01 2.087847e+00 0.0000000 1.100000e+01 1.200000e+01 1.200000e+01 12.0 ▁▁▁▁▇
numeric N_NOR_24M 4 0.9999210 1.954708e+01 5.735522e+00 0.0000000 1.600000e+01 2.300000e+01 2.400000e+01 24.0 ▁▁▁▂▇
numeric N_ULT_DIFNOR_12M 42273 0.1648953 2.663472e+00 3.367172e+00 0.0000000 0.000000e+00 1.000000e+00 5.000000e+00 11.0 ▇▂▁▁▁
numeric N_ULT_DIFNOR_24M 39071 0.2281509 6.712876e+00 7.364572e+00 0.0000000 0.000000e+00 4.000000e+00 1.300000e+01 23.0 ▇▂▂▂▂
numeric N_ULT_NOR_ALI_24M 15 0.9997037 1.642723e-01 9.908223e-01 0.0000000 0.000000e+00 0.000000e+00 0.000000e+00 23.0 ▇▁▁▁▁
numeric PROM_DEUREV_24M 49379 0.0245160 1.086941e+04 2.214937e+04 1.2000000 8.448577e+02 1.864724e+03 7.287422e+03 221562.4 ▇▁▁▁▁
numeric PROM_DEUVNCD_12M 47845 0.0548202 2.977293e+03 1.235696e+04 0.0100000 1.000250e+02 3.372525e+02 1.330995e+03 265696.1 ▇▁▁▁▁
numeric RMAX_DACT_DACTSH_24M 4 0.9999210 1.317123e+05 2.963226e+07 0.0105973 1.238403e+00 1.525753e+00 1.897040e+00 6666666666.0 ▇▁▁▁▁
numeric RMAX_DREV_DDIR_24M 4 0.9999210 1.083935e+09 1.724837e+08 0.0003603 1.111111e+09 1.111111e+09 1.111111e+09 4444444444.0 ▁▇▁▁▁
numeric RMAX_DVNCD_DDIR_12M 5 0.9999012 1.050260e+09 2.533848e+08 0.0000002 1.111111e+09 1.111111e+09 1.111111e+09 4444444444.0 ▁▇▁▁▁
numeric RTOT_DACT_DTOT_24M 4 0.9999210 1.317115e+05 2.963226e+07 0.0068225 7.690151e-01 9.599023e-01 1.000000e+00 6666666666.0 ▇▁▁▁▁
numeric RTOT_DVNCD_DDIR_12M 5 0.9999012 1.050260e+09 2.533848e+08 0.0000000 1.111111e+09 1.111111e+09 1.111111e+09 4444444444.0 ▁▇▁▁▁
numeric R_DREV_DDIR_24M 4 0.9999210 1.083935e+09 1.724837e+08 0.0005018 1.111111e+09 1.111111e+09 1.111111e+09 4444444444.0 ▁▇▁▁▁
numeric R_DVNCD_DDIR_12M 5 0.9999012 1.050260e+09 2.533848e+08 0.0000003 1.111111e+09 1.111111e+09 1.111111e+09 4444444444.0 ▁▇▁▁▁
numeric VAR_MAX_CAL_ACTU_24M 9 0.9998222 6.097980e-02 1.616966e-01 0.0000000 0.000000e+00 0.000000e+00 0.000000e+00 1.0 ▇▁▁▁▁
numeric VAR_PROM_DEUDIR_ACTU_12M 5 0.9999012 2.634267e+05 2.793688e+07 -0.8866074 -2.653745e-01 -1.429700e-03 3.036712e-01 4444444444.0 ▇▁▁▁▁
numeric VAR_PROM_ENT_ACTU_24M 4 0.9999210 2.195177e+05 2.208571e+07 -0.7333333 -2.083333e-01 0.000000e+00 0.000000e+00 2222222222.0 ▇▁▁▁▁

Máximo atrasos en los últimos 12 meses

Número de meses con atrasos mayores iguales a 15 en los últimos 6 meses de comportamiento en los últimos 24 meses

Número máximo de entidades acreedoras en los últimos 12 meses

Selección de Variables

  • Reducción Secuencial:

    • Descartar Variables Altamente Correlacionadas (collinear)
    • Descartar Variables con Cero Importancia (catboost)
    • Descartar Variables con Cero Información Mutua (entropy)
  • Importancia de las Variables:

    • Recursive Feature Elimination usando Logistic regression
    • Logistic Regression L1 Penalty (Ridge)
    • Logistic Regression L2 Penalty (Lasso)
    • Random Forest
    • Boosting Machines:
      • AdaBoost
      • LighGBM
      • XGBoost
      • CatBoost
  • Algorítmo: “Boruta” usando XGBoost

# system
import os
import warnings

# general data manipulation
import numpy as np
import pandas as pd
import seaborn as sns

# data pre-processing
from sklearn.compose import ColumnTransformer 
from sklearn.preprocessing import StandardScaler, MinMaxScaler

# feature selection
from scipy.stats import pearsonr, pointbiserialr

from statsmodels import api as smc

# spliting
from sklearn.model_selection import train_test_split

# feature selection
from sklearn.feature_selection import chi2
from sklearn.feature_selection import mutual_info_classif
from sklearn.feature_selection import RFE
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import SelectFromModel
from boruta import BorutaPy


# imbalance class
from imblearn.over_sampling import SMOTE

# machine learning
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from catboost import CatBoostClassifier
from sklearn.tree import DecisionTreeClassifier 
from sklearn import tree

from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import RandomForestClassifier

from sklearn.linear_model import LogisticRegression

# model evluation metrics
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve

# visualization
from matplotlib import pyplot as plt
plt.style.use('seaborn-whitegrid')

# external feature selector
from external.feature_selector import FeatureSelector

Selección de Modelo

Extreme Gradient Boosting (XGBoost)

  • XGBoost: Algoritmo de Machine Learning para resolver problemas de Clasificación y Regresión.

Dataset Cleaned.

base10 <- read.csv('base10.csv')
base10 <- base10 %>% 
  mutate(FLG_CLI_DEF60 = as.factor(FLG_CLI_DEF60))
base10 %>% glimpse()
Rows: 50,591
Columns: 11
$ MAX_ATR_I_12M            <int> 2, 9, 0, 2, 9, 6, 4, 0, 2, 4, 2, 1, 8, 7, 12,…
$ NMES_ATR15_I_U6K_24M     <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
$ RTOT_DACT_DTOT_24M       <dbl> 0.9862304, 0.7068346, 0.2484270, 0.8480767, 1…
$ VAR_PROM_ENT_ACTU_24M    <dbl> 0.00000000, 0.00000000, 0.00000000, 0.0104166…
$ NMES_UATR3_I_24M         <int> 0, 6, 0, 0, 1, 5, 0, 14, 23, 2, 0, 0, 0, 1, 0…
$ VAR_PROM_DEUDIR_ACTU_12M <dbl> -0.54984899, 0.94141490, 0.57636331, -0.16470…
$ INC_SUM_ACTSH_ACTU_24M   <dbl> 8.073189, 46.718352, 11.610906, 20.127711, 33…
$ MAX_ENT_12M              <int> 1, 1, 1, 5, 3, 1, 4, 1, 2, 1, 1, 3, 5, 3, 1, …
$ N_NOR_24M                <int> 20, 19, 8, 24, 24, 24, 24, 20, 23, 24, 24, 24…
$ NMES_UATR15_I_U6K_24M    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
$ FLG_CLI_DEF60            <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …

Initial Split

set.seed(123)
coll_split <- initial_split(base10, strata = FLG_CLI_DEF60)
coll_train <- training(coll_split)
coll_test <- testing(coll_split)

Transform for Imbalance Scenario

coll_rec <- recipe(FLG_CLI_DEF60 ~ .,data = coll_train) %>%
  step_downsample(FLG_CLI_DEF60, under_ratio = 3) %>% 
  step_smote(FLG_CLI_DEF60)
coll_prep <- prep(coll_rec)
coll_rec %>%  prep() %>% bake(new_data=NULL) %>% count(FLG_CLI_DEF60)
# A tibble: 2 × 2
  FLG_CLI_DEF60     n
  <fct>         <int>
1 0             12183
2 1             12183

Cross Validation

set.seed(345)
coll_folds <- vfold_cv(coll_train, strata = FLG_CLI_DEF60)

Define Machine Learning Model

xgb_spec <- boost_tree(
  trees = tune(), 
  tree_depth = tune(), 
  min_n = tune(), 
  loss_reduction = tune(),                     
  sample_size = tune(), 
  mtry = tune(),         
  learn_rate = tune(),                        
) %>% 
  set_engine("xgboost", nthread = 8) %>% 
  set_mode("classification")

Define Workflow

xgb_wf <- workflow() %>%
  add_model(xgb_spec) %>% 
  add_recipe(coll_rec)
xgb_wf
══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: boost_tree()

── Preprocessor ────────────────────────────────────────────────────────────────
2 Recipe Steps

• step_downsample()
• step_smote()

── Model ───────────────────────────────────────────────────────────────────────
Boosted Tree Model Specification (classification)

Main Arguments:
  mtry = tune()
  trees = tune()
  min_n = tune()
  tree_depth = tune()
  learn_rate = tune()
  loss_reduction = tune()
  sample_size = tune()

Engine-Specific Arguments:
  nthread = 8

Computational engine: xgboost 

Define Parameters

xgb_params <- parameters(
  trees(), learn_rate(),
  tree_depth(), min_n(), 
  loss_reduction(),
  sample_size = sample_prop(), finalize(mtry(), coll_train)  
)
xgb_params <- xgb_params %>% update(trees = trees(c(100, 500)))

Define Grid for Initial Tune

xgb_grid <- xgb_params %>% 
  grid_max_entropy(size = 14)

Iterative Bayesian Optimization

doParallel::registerDoParallel()
tic()
# Define grid search for initial tune
set.seed(123)
xgb_grid_search <- tune_grid(
  xgb_wf,
  resamples = coll_folds,
  grid = xgb_grid
)
# Bayesian
set.seed(234)
xgb_tune <- tune_bayes(
   xgb_wf,
   resamples = coll_folds,
   param_info = xgb_params,
   initial = xgb_grid_search,
   iter = 30,
   metrics = metric_set(roc_auc, sensitivity, specificity, precision,recall,f_meas),
   control = control_bayes(no_improve = 30, verbose = TRUE)
)
toc()

Results

Collect Metrics

# A tibble: 208 × 14
   trees learn_rate tree_depth min_n loss_reduction sample_size  mtry .metric 
   <int>      <dbl>      <int> <int>          <dbl>       <dbl> <int> <chr>   
 1   357   1.33e-10         13    31  0.000723            0.808     8 accuracy
 2   357   1.33e-10         13    31  0.000723            0.808     8 roc_auc 
 3   152   1.39e-10         10     5  0.202               0.474     2 accuracy
 4   152   1.39e-10         10     5  0.202               0.474     2 roc_auc 
 5   213   1.43e-10          6    21  0.0357              0.284     6 accuracy
 6   213   1.43e-10          6    21  0.0357              0.284     6 roc_auc 
 7   454   3.76e-10          7    27  0.00000000917       0.108     8 accuracy
 8   454   3.76e-10          7    27  0.00000000917       0.108     8 roc_auc 
 9   144   6.15e-10         15    21  0.00489             0.666     6 accuracy
10   144   6.15e-10         15    21  0.00489             0.666     6 roc_auc 
# ℹ 198 more rows
# ℹ 6 more variables: .estimator <chr>, mean <dbl>, n <int>, std_err <dbl>,
#   .config <chr>, .iter <int>

AUC

# A tibble: 44 × 14
   trees learn_rate tree_depth min_n loss_reduction sample_size  mtry .metric
   <int>      <dbl>      <int> <int>          <dbl>       <dbl> <int> <chr>  
 1   357   1.33e-10         13    31        7.23e-4       0.808     8 roc_auc
 2   152   1.39e-10         10     5        2.02e-1       0.474     2 roc_auc
 3   213   1.43e-10          6    21        3.57e-2       0.284     6 roc_auc
 4   454   3.76e-10          7    27        9.17e-9       0.108     8 roc_auc
 5   144   6.15e-10         15    21        4.89e-3       0.666     6 roc_auc
 6   139   1.69e- 9          7    21        2.68e+1       0.748     3 roc_auc
 7   167   2.19e- 8         15    16        6.74e-3       0.113     8 roc_auc
 8   406   5.52e- 4         12    16        9.39e-5       0.303     1 roc_auc
 9   195   6.40e- 4          9    34        1.17e-9       0.265     5 roc_auc
10   392   3.97e- 3         11    21        6.01e-1       0.866     9 roc_auc
# ℹ 34 more rows
# ℹ 6 more variables: .estimator <chr>, mean <dbl>, n <int>, std_err <dbl>,
#   .config <chr>, .iter <int>

Best

# A tibble: 5 × 14
  trees learn_rate tree_depth min_n loss_reduction sample_size  mtry .metric
  <int>      <dbl>      <int> <int>          <dbl>       <dbl> <int> <chr>  
1   469    0.00402         13    24    0.000000161       0.323     5 roc_auc
2   387    0.0921           4    31   16.6               0.771     8 roc_auc
3   500    0.0512           7     9   27.7               0.767     5 roc_auc
4   401    0.0565           2    25    0.264             0.841     6 roc_auc
5   211    0.0300           5     2   26.9               0.151     3 roc_auc
# ℹ 6 more variables: .estimator <chr>, mean <dbl>, n <int>, std_err <dbl>,
#   .config <chr>, .iter <int>

Best AUC

# A tibble: 1 × 8
  trees learn_rate tree_depth min_n loss_reduction sample_size  mtry .config
  <int>      <dbl>      <int> <int>          <dbl>       <dbl> <int> <chr>  
1   469    0.00402         13    24    0.000000161       0.323     5 Iter23 

Final Model

══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: boost_tree()

── Preprocessor ────────────────────────────────────────────────────────────────
2 Recipe Steps

• step_downsample()
• step_smote()

── Model ───────────────────────────────────────────────────────────────────────
Boosted Tree Model Specification (classification)

Main Arguments:
  mtry = 5
  trees = 469
  min_n = 24
  tree_depth = 13
  learn_rate = 0.00402207198365528
  loss_reduction = 1.61418982518867e-07
  sample_size = 0.323390904612616

Engine-Specific Arguments:
  nthread = 8

Computational engine: xgboost 

Importance

Last Fit Testing

# A tibble: 6 × 4
  .metric     .estimator .estimate .config             
  <chr>       <chr>          <dbl> <chr>               
1 sensitivity binary         0.853 Preprocessor1_Model1
2 specificity binary         0.639 Preprocessor1_Model1
3 precision   binary         0.952 Preprocessor1_Model1
4 recall      binary         0.853 Preprocessor1_Model1
5 f_meas      binary         0.899 Preprocessor1_Model1
6 roc_auc     binary         0.835 Preprocessor1_Model1

Confusion Matrix

ROC-AUC Testing

Explicabilidad del Modelo

  • La explicabilidad del modelo se refiere al concepto de poder comprender el modelo de aprendizaje automático.

  • Las explicaciones aditivas de Shapley son un enfoque independiente del modelo, donde las contribuciones promedio de las características se calculan bajo diferentes combinaciones o “coaliciones” de ordenamiento de características.

Preguntas